package model

import (
	"github.com/go-gin-admin/global"
)

type IDictItem interface {
	InsertDictItem() (int64, error)                                                 // 增加字典选项
	UpdateDictItem() error                                                          // 更新字典选项
	RemoveDictItem(id int64) error                                                  // 删除字典选项
	GetDictItemList(id int64, pageIndex int64, pageSize int64) (interface{}, error) // 获取字典项
	GetDictItemByType(dictType string) ([]DictItem, error)                          // 根据字典类型获取字典选项
}

type DictItem struct {
	Id          int64  `json:"id" gorm:"primary_key"`       // 主键
	DictId      int64  `json:"dictId"`                      // 字典id
	Value       string `json:"value"`                       // 字典选项值
	Label       string `json:"label"`                       // 字典选项标题
	Type        string `json:"type"`                        // 字典选项类型
	Description string `json:"description"`                 // 字典选项描述
	Sort        int64  `json:"sort"`                        // 排序（升序）
	Remarks     string `json:"remarks"`                     // 备注
	DelFlag     string `json:"del_flag" gorm:"default:'0'"` // 删除标记,1:已删除,0:正常
	BaseModel
}

// 添加字典选项
func (d *DictItem) InsertDictItem() (int64, error) {
	if err := global.GDB.Table("sys_dict_item").Create(&d).Error; err != nil {
		return 0, nil
	}
	return d.Id, nil
}

// 更新字典选项
func (d *DictItem) UpdateDictItem() error {
	table := global.GDB.Table("sys_dict_item")
	table = table.Where("id = ?", d.Id)
	if err := table.Updates(map[string]interface{}{"value": d.Value, "label": d.Label, "type": d.Type, "description": d.Description, "sort": d.Sort, "remarks": d.Remarks, "update_time": d.UpdateTime}).Error; err != nil {
		return err
	}
	return nil
}

// 删除字段选项
func (d *DictItem) RemoveDictItem(id int64) error {
	table := global.GDB.Table("sys_dict_item")
	table = table.Where("id = ?", id)
	if err := table.Update("del_flag", "1").Error; err != nil {
		return err
	}
	return nil
}

// 根据字典type获取字典选项
func (d *DictItem) GetDictItemByType(dictType string) ([]DictItem, error) {
	var dictItem []DictItem
	table := global.GDB.Table("sys_dict_item")
	table = table.Select("id, dict_id, value, label, type, description, sort, create_time, update_time, remarks, del_flag")
	table = table.Where("del_flag = ?", "0")
	table = table.Where("type = ?", dictType)
	if err := table.Find(&dictItem).Error; err != nil {
		return dictItem, err
	}
	return dictItem, nil
}

// 获取字典的字典选项
func (d *DictItem) GetDictItemList(id int64, pageIndex int64, pageSize int64) (interface{}, error) {
	var dictItem []DictItem
	var total int64
	table := global.GDB.Table("sys_dict_item")
	table = table.Select("id, dict_id, value, label, type, description, sort, create_time, update_time, remarks, del_flag")
	table = table.Where("del_flag = ?", "0")
	table = table.Where("dict_id = ?", id)
	if err := table.Count(&total).Error; err != nil {
		return dictItem, err
	}
	table = table.Offset((pageIndex - 1) * pageSize).Limit(pageSize)
	if err := table.Find(&dictItem).Error; err != nil {
		return dictItem, err
	}

	m := make(map[string]interface{})
	m["item"] = dictItem
	m["total"] = total
	return m, nil
}
